package com.guigu.eduservice.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * 设备预定表实体类
 * 对应数据库表：equipment_reservation
 */
@Data
@TableName("equipment_reservation") // 指定数据库表名
public class EquipmentReservation {

    /**
     * 预定记录唯一标识（主键）
     * 对应字段：reservation_id，自增
     */
    @TableId(type = IdType.AUTO) // 主键自增策略
    private Long reservationId;

    /**
     * 关联用户表user_id（发起预定的买家）
     * 对应字段：user_id，非空
     */
    private Long userId;

    /**
     * 关联设备表equipment_id（目标预定设备）
     * 对应字段：equipment_id，非空
     */
    private Long equipmentId;

    /**
     * 预定押金金额（用户支付的预定保证金，默认不低于设备原价的5%）
     * 对应字段：reservation_deposit，非空（DECIMAL(10,2)）
     */
    private BigDecimal reservationDeposit;

    /**
     * 预定有效期（单位：天，如3天内需完成下单，过期自动取消）
     * 对应字段：reservation_period，非空
     */
    private Integer reservationPeriod;

    /**
     * 预定状态（0-待支付押金，1-已支付押金，2-已转订单，3-已取消，4-已过期）
     * 对应字段：reservation_status，非空，默认0
     */
    private Integer reservationStatus;

    /**
     * 押金支付时间（reservation_status=1时记录）
     * 对应字段：deposit_pay_time，可为空
     */
    private Date depositPayTime;

    /**
     * 关联订单表order_id（reservation_status=2时必填，记录转为的正式订单）
     * 对应字段：order_id，可为空
     */
    private Long orderId;

    /**
     * 取消原因（reservation_status=3时填写，如"用户放弃购买"）
     * 对应字段：cancel_reason，可为空（VARCHAR(500)）
     */
    private String cancelReason;

    /**
     * 取消时间（reservation_status=3时记录）
     * 对应字段：cancel_time，可为空
     */
    private Date cancelTime;

    /**
     * 预定过期时间（根据create_time+reservation_period计算，过期自动更新状态为4）
     * 对应字段：expire_time，非空
     */
    private Date expireTime;

    /**
     * 记录创建时间（用户发起预定的时间）
     * 对应字段：create_time，非空，默认当前时间
     * 自动填充：新增时赋值
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 记录更新时间
     * 对应字段：update_time，非空，默认当前时间，更新时自动刷新
     * 自动填充：新增/更新时赋值
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableField(exist = false)
    private Equipment equipment;
}